package opf5.ui;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.UIManager;

import opf5.casosDeUso.Login;
import opf5.casosDeUso.LoginDependiente;
import opf5.casosDeUso.LoginObserver;
import opf5.entities.dominio.Jugador;
import opf5.entities.excepciones.OperacionNoPermitidaException;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.SwingConstants;
import java.awt.SystemColor;
import java.awt.Color;

public class VistaMenuPrincipal implements LoginObserver {
	private JFrame frame;
	
	private VistaInscripcionPartido inscripcionPartido;
	private VistaBajaPartidos bajaPartido;
	private VistaProponerJugador proponerJugador;
	private VistaMisInfracciones misInfracciones;
	private VistaAdministrarPropuestas propuestasDisponibles;
	private Login loginController;

	private String nombreJugador = "";

	private JButton btnInscribirseAPartido;
	private JButton btnLogin;
	private JButton btnLogout;
	private JButton btnMisPartidos;
	private JButton btnProponerNuevoJugador;
	private JButton btnMisInfracciones;
	private JButton btnCalificarJugador;
	private JButton btnCrearPartido;
	private JButton btnAdministrarPartidos;
	private JButton btnPropuestasPendientes;
	private JButton btnHandicaps;

	private VistaCrearPartido crearPartido;

	private VistaAdministrarPartidos administrarPartidos;

	private VistaCalificarJugador calificarJugador;

	private VistaHandicap handicaps;
	private JButton btnBuscarJugadores;

	private VistaBusquedaJugadores buscarJugadores;
	private JLabel lblOpf;
	private JLabel lblOrganizadorDePartidos;


	
	public VistaMenuPrincipal(Login loginController,
			VistaInscripcionPartido inscripcionPartido,
			VistaBajaPartidos bajaPartido,
			VistaProponerJugador proponerJugador,
			VistaMisInfracciones misInfracciones,
			VistaAdministrarPropuestas administrarPropuestas,
			VistaCrearPartido crearPartido,
			VistaAdministrarPartidos administrarPartidos,
			VistaCalificarJugador calificarJugador,
			VistaHandicap handicaps,
			VistaBusquedaJugadores buscarJugadores) {
		this.loginController = loginController;
		this.inscripcionPartido = inscripcionPartido;
		this.bajaPartido = bajaPartido;
		this.proponerJugador = proponerJugador;
		this.misInfracciones = misInfracciones;
		this.propuestasDisponibles = administrarPropuestas;
		this.crearPartido = crearPartido;
		this.administrarPartidos = administrarPartidos;
		this.calificarJugador = calificarJugador;
		this.handicaps = handicaps;
		this.buscarJugadores = buscarJugadores;
		
		loginController.agregarObserver(this);
	}

	/**
	 * Initialize the contents of the frame.
	 * @wbp.parser.entryPoint
	 */
	public void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 259, 570);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		btnInscribirseAPartido = new JButton("Inscribirse a partido");
		btnInscribirseAPartido.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				runInscripcionPartido();
			}
		});
		btnInscribirseAPartido.setBounds(12, 154, 222, 25);
		frame.getContentPane().add(btnInscribirseAPartido);
		
		btnLogin = new JButton("Login");
		btnLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				realizarLogin();
			}
		});
		btnLogin.setBounds(12, 59, 222, 25);
		frame.getContentPane().add(btnLogin);
		
		btnLogout = new JButton("Logout");
		btnLogout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				realizarLogout();
			}
		});
		btnLogout.setBounds(12, 96, 222, 25);
		frame.getContentPane().add(btnLogout);
		
		btnMisPartidos = new JButton("Baja de partido");
		btnMisPartidos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runBajaPartido();
			}
		});
		btnMisPartidos.setBounds(12, 189, 222, 25);
		frame.getContentPane().add(btnMisPartidos);
		
		btnProponerNuevoJugador = new JButton("Proponer nuevo jugador");
		btnProponerNuevoJugador.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runProponerJugador();
			}
		});
		btnProponerNuevoJugador.setBounds(12, 263, 222, 25);
		frame.getContentPane().add(btnProponerNuevoJugador);
		
		btnPropuestasPendientes = new JButton("Propuestas Pendientes");
		btnPropuestasPendientes.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				runPropuestasDisponibles();
			}
		});
		btnPropuestasPendientes.setBounds(12, 459, 222, 25);
		frame.getContentPane().add(btnPropuestasPendientes);
		
		btnMisInfracciones = new JButton("Mis Infracciones");
		btnMisInfracciones.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				runMisInfracciones();
			}
		});
		btnMisInfracciones.setBounds(12, 226, 222, 25);
		frame.getContentPane().add(btnMisInfracciones);
		
		btnCalificarJugador = new JButton("Calificar Jugador");
		btnCalificarJugador.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runCalificarJugador();
			}
		});
		btnCalificarJugador.setBounds(12, 300, 222, 25);
		frame.getContentPane().add(btnCalificarJugador);
		
		btnCrearPartido = new JButton("Crear Partido");
		btnCrearPartido.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runCrearPartido();
			}
		});
		btnCrearPartido.setBounds(12, 385, 222, 25);
		frame.getContentPane().add(btnCrearPartido);
		
		btnAdministrarPartidos = new JButton("Administrar Partidos");
		btnAdministrarPartidos.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runAdministrarPartidos();
			}
		});
		btnAdministrarPartidos.setBounds(12, 422, 222, 25);
		frame.getContentPane().add(btnAdministrarPartidos);
		
		btnHandicaps = new JButton("Handicaps");
		btnHandicaps.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runHandicaps();
			}
		});
		btnHandicaps.setBounds(12, 496, 222, 25);
		frame.getContentPane().add(btnHandicaps);
		
		btnBuscarJugadores = new JButton("Buscar jugadores");
		btnBuscarJugadores.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				runBuscarJugadores();
			}
		});
		btnBuscarJugadores.setBounds(12, 336, 222, 23);
		frame.getContentPane().add(btnBuscarJugadores);
		
		lblOpf = new JLabel("OPF5");
		lblOpf.setForeground(new Color(0, 0, 139));
		lblOpf.setHorizontalAlignment(SwingConstants.CENTER);
		lblOpf.setFont(new Font("Tahoma", Font.BOLD, 18));
		lblOpf.setBounds(12, 11, 222, 14);
		frame.getContentPane().add(lblOpf);
		
		lblOrganizadorDePartidos = new JLabel("Organizador de partidos de fultbol 5");
		lblOrganizadorDePartidos.setForeground(new Color(0, 0, 139));
		lblOrganizadorDePartidos.setHorizontalAlignment(SwingConstants.CENTER);
		lblOrganizadorDePartidos.setBounds(0, 34, 243, 14);
		frame.getContentPane().add(lblOrganizadorDePartidos);
	
			
		final VistaMenuPrincipal window = this;
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
		this.ocultarOpciones();
	}

	protected void runBuscarJugadores() {
		this.buscarJugadores.initialize();
	}

	protected void runHandicaps() {
		this.handicaps.initialize();
	}

	protected void runCalificarJugador() {
		this.calificarJugador.initialize();
	}

	protected void runAdministrarPartidos() {
		this.administrarPartidos.initialize();
	}

	protected void runCrearPartido() {
		this.crearPartido.initialize();
	}

	protected void runPropuestasDisponibles() {
		this.propuestasDisponibles.initialize();
	}

	protected void runMisInfracciones() {
		this.misInfracciones.initialize();
	}

	protected void runProponerJugador() {
		this.proponerJugador.initialize();
	}

	protected void runBajaPartido() {
		this.bajaPartido.initialize();
	}

	protected void realizarLogout() {
		loginController.logoutUsuario();
	}

	protected void realizarLogin() {
		String idUsuario = JOptionPane.showInputDialog(frame, "Ingrese el ID del usuario");
		try {
			this.loginController.loginUsuario(idUsuario);
		} catch (OperacionNoPermitidaException e) {
			JOptionPane.showMessageDialog(frame, e.mensaje);
		}
	}

	protected void runInscripcionPartido() {
		this.inscripcionPartido.initialize();
	}

	@Override
	public void login(Jugador jugador) {
		this.nombreJugador = jugador.getNombre();
		mostrarOpciones();
	}

	private void mostrarOpciones() {
		btnLogin.hide();
		btnInscribirseAPartido.show();
		btnLogout.show();
		btnMisPartidos.show();
		btnProponerNuevoJugador.show();
		btnMisInfracciones.show();
		btnCalificarJugador.show();
		btnBuscarJugadores.show();
		this.frame.setSize(259, 410);
		
		if (this.nombreJugador.equals("admin")) {
			btnCrearPartido.show();
			btnAdministrarPartidos.show();
			btnPropuestasPendientes.show();
			btnHandicaps.show();
			this.frame.setSize(259, 570);
		}
	}

	@Override
	public void logout() {
		this.nombreJugador  = "";
		ocultarOpciones();
	}

	private void ocultarOpciones() {
		btnInscribirseAPartido.hide();
		btnLogout.hide();
		btnMisPartidos.hide();
		btnProponerNuevoJugador.hide();
		btnMisInfracciones.hide();
		btnCalificarJugador.hide();
		btnCrearPartido.hide();
		btnAdministrarPartidos.hide();
		btnPropuestasPendientes.hide();
		btnHandicaps.hide();
		btnBuscarJugadores.hide();
		
		btnLogin.show();
		
		this.frame.setSize(259, 130);
	}
}
